
import {Native} from './native.js';
import {os} from './os.js';
import {Task} from './task.js';
import {http } from './http.js';

/**
 * @static
 * @author GuoHua Liu
 * @copyright Copyright © 2019 GuoHua Liu. All rights reserved.
 */
class wx {

    /**
     * @typedef WxError
     * @property {string} errMsg
     * @property {number} errCode
     */

    /**
     * @typedef AuthCode
     * @property {string} code
     */

    /**
     * 支持浏览器：否，浏览器调用被reject<br>
     * 该方法仅仅获取微信授权码，应用层需要将此code提交服务器
     * @returns {Task} 成功回调参数{@link AuthCode}，失败回调参数{@link WxError}
     * **错误码列表：**
     * - -1 环境不支持
     * - 其他 授权失败（未知错误）
     */
    static auth() {
            let newTask = new Task();
            if(!os.isHos()) {
                newTask.__reject({errMsg:"当前环境不支持", errCode:-1});
                return newTask;
            }
            let task = Native.getInstance().callNative("wx", {"metho":"auth"}, true, resp=>{
                if (resp.code) {
                    newTask.__resolve(resp)
                    return;
                }
                if (resp.errStr) {
                    newTask.__reject({errMsg:resp.errStr, errCode:1});
                    return;
                }
                newTask.__reject({"errMsg":"授权失败", errCode:2});
            }, (error)=>{newTask.__reject(error)});
            console.log("发起微信授权请求-->" + task);
            newTask.__setAbort(task.abort);
            return newTask;
    }

    /**
     * 支持浏览器：否，浏览器总是返回false<br>
     * 判断是否支持微信App
     * @returns {Boolean} true:支持 false：不支持
     */
    static isWXAppSupport() {
        if (os.isHos()) {
            const res = Native.getInstance().syncCallNative("wx", {"method": "isWXAppSupport"});
            return !!res.support;
        } else {
            return false
        }
    }



    /**
     * 支持浏览器：否，浏览器总是返回false
     * 判断是否安装了微信App，该函数返回false，调用isWXAppSupport也一定返回false。
     * @returns {Boolean} true:已经安装 false：未安装
     */
    static isWXAppInstalled() {
        if (os.isHos()) {
            const res = Native.getInstance().syncCallNative("wx", {"method": "isWXAppInstalled"});
            return !!res.support;
        } else {
            return false
        }
    }
    /**
     * 支持浏览器：否，浏览器总是返回null
     * 获取微信appid,secret也会一同携带回来（暂定）
     * @return {{appid:string,secret:string}|null} 微信的appid和secret
     */
    static appid() {
        if (os.isHos()) {
            return Native.getInstance().syncCallNative("wx", {"method": "WxAppAccount"});
        } else {
            return null
        }//
    }

    /**
     * 支持浏览器：否，浏览器调用被reject<br>
     * 该方法在getCode后直接申请token，如果需要自己申请或者由服务器申请应该直接用wx.auth接口。
     * @returns {Promise} 成功：返回令牌等信息，失败：返回{"errMsg":string, "errCode":number}。
     * **错误码列表：**
     * - -1环境不支持
     * - 其他 未知错误
     */
    static login() {
        return new Promise((resolve,reject)=>{
            if (!os.isHos) {
                reject({"errMsg":"当前环境不支持", "errCode":-1});
                return;
            }

            let ac = wx.appid();
            let url = "https://api.weixin.qq.com/sns/oauth2/access_token";
            wx.auth().then(resp=>{
                http.get(url, {
                "code":resp.code,
                "secret":ac.secret,
                "appid":ac.appid,
                "grant_type":"authorization_code"})
                .then(resolve, reject);
            }, reject);

        })
    }
    /**
     * 支持浏览器：否，浏览器调用被reject<br>
     * req包含下面字段：
        // 商家向财付通申请的商家id
        req.partnerId
        // 预支付订单
        req.prepayId
        // 随机串，防重发
        req.nonceStr
        // 时间戳，防重发
        req.timeStamp
        // 商家根据财付通文档填写的数据和签名
        req.package
        // 商家根据微信开放平台文档对数据做的签名
        req.sign
     * @returns {Task} 成功：返回支付结果，失败：返回{"errMsg":string, "errCode":number}。
     * **错误码列表：**
     * - =0或者未定义errCode字段 成功
     * - -1环境不支持
     * - 其他 未知错误
     */
    static pay(req) {
        let newTask = new Task();
        if(!os.isHos()) {
            newTask.__reject({errMsg:"当前环境不支持", errCode:-1});
            return newTask;
        }
        let task = Native.getInstance().callNative("wx", {"method":"pay","partnerId":req.partnerId,"prepayId":req.prepayId,"nonceStr":req.nonceStr,"timeStamp":req.timeStamp,"package":req.package,"sign":req.sign}, true, resp=>{
            if (!resp.hasOwnProperty("errCode") || resp.errCode == 0) {
                newTask.__resolve(resp)
                return;
            }
            if (resp.errStr) {
                newTask.__reject({errMsg:resp.errStr, errCode:1});
                return;
            } else {}
            newTask.__reject({"errMsg":"支付失败", errCode:2});
        }, (error)=>{newTask.__reject(error)});
        console.log("发起微信支付请求-->" + task);
        newTask.__setAbort(task.abort);
        return newTask;
    }

}

export {wx}
